package com.qezhhnjy.demo.ftp.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.net.SocketException;

/**
 * @author zhaoyangfu - 2021/2/25 14:33
 */
@Data
@ConfigurationProperties(prefix = "ftp")
@Configuration
@Slf4j
public class FtpConfig {

    private String host;
    private int    port;
    private String username;
    private String password;
    private String rootPath;
    private String webHost;
    private int    webPort;

    public FTPClient ftpClient() {
        FTPClient client = new FTPClient();
        // 设置连接超时时间
        client.setConnectTimeout(1000 * 30);
        // 设置ftp字符集
        client.setControlEncoding("utf-8");
        // 设置被动模式，文件传输端口设置
        // ftp客户端与服务端之间数据传输，主动模式和被动模式
        // 请移至这个哥们的博文中查看，https://www.cnblogs.com/mawanglin2008/articles/3607767.html，写的非常好。
        // 主动模式：ftp客户端产生一个随机端口，并告知ftp服务端，最后服务端的20端口会与这个随机端口建立连接，进行数据传输
        // 被动模式：ftp服务端产生一个随机端口，并告知ftp客户端，最后客户端与这个随机端口建立连接，进行数据传输
        client.enterLocalPassiveMode();
        try {
            //设置文件传输模式为二进制，可以保证传输的内容不会被改变
            client.setDefaultPort(port);
            client.connect(host, port);
            client.login(username, password);
            client.setFileType(FTP.BINARY_FILE_TYPE);
            int reply = client.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                client.disconnect();
                log.error("未连接到FTP，用户名或密码错误!");
                return null;
            } else {
                log.info("FTP连接成功!");
                return client;
            }
        } catch (SocketException e) {
            log.error("FTP的IP地址可能错误，请正确配置!", e);
            return null;
        } catch (IOException e) {
            log.error("FTP的端口错误,请正确配置!", e);
            return null;
        }
    }
}
